#ifndef APP_MSG_H
#define APP_MSG_H

#include <stdint.h>
#include <stdbool.h>
#include "nst_msg.h"
#include "user_config.h"

/* 队列大小配置 */
#define MIDI_MSG_QUEUE_SIZE      128
#define UART_MSG_DATA_MAX_LEN    64  // 数据最大长度（用于动态分配）

#ifndef UART_RX_MSG_QUEUE_SIZE
#define UART_RX_MSG_QUEUE_SIZE   4
#endif

#define UART_PORT_COUNT          3


// 第一个串口发送队列大小
#ifndef UART_TX_MSG_QUEUE_SIZE_0
#define UART_TX_MSG_QUEUE_SIZE_0 4
#endif

// 第二个串口发送队列大小
#ifndef UART_TX_MSG_QUEUE_SIZE_1
#define UART_TX_MSG_QUEUE_SIZE_1 4
#endif

// 第三个串口发送队列大小
#ifndef UART_TX_MSG_QUEUE_SIZE_2
#define UART_TX_MSG_QUEUE_SIZE_2 4
#endif

// 计算三个队列大小中的最大值
#define UART_TX_MSG_QUEUE_MAX_SIZE ((UART_TX_MSG_QUEUE_SIZE_0 > UART_TX_MSG_QUEUE_SIZE_1)? \
                                    ((UART_TX_MSG_QUEUE_SIZE_0 > UART_TX_MSG_QUEUE_SIZE_2)? UART_TX_MSG_QUEUE_SIZE_0 : UART_TX_MSG_QUEUE_SIZE_2) : \
                                    ((UART_TX_MSG_QUEUE_SIZE_1 > UART_TX_MSG_QUEUE_SIZE_2)? UART_TX_MSG_QUEUE_SIZE_1 : UART_TX_MSG_QUEUE_SIZE_2))

typedef enum {
    T_MSG_UART_RX_TYPE  = 0x00,
    T_MSG_UART_TX_TYPE  = 0x10,
    T_MSG_MIDI_TYPE     = 0x20,  // MIDI 消息类型标识
    // 其他类型...
} T_APP_MSG_TYPE;

/* 消息结构体定义（data为指针，内存一次性分配） */
typedef struct {
    uint8_t len;    // 消息数据长度（单位：字节）
    union {
        uint8_t type; // 消息类型
        uint8_t port; // 消息端口
    } tp;
    uint8_t *data;  // 数据指针（指向同一块内存块的后面空间）
} app_msg_t;

/* 队列实例声明 */
extern nst_msg_queue_t midi_queue;
extern nst_msg_queue_t uart_rx_queue;
extern nst_msg_queue_t uart_tx_queues[UART_PORT_COUNT];

/* 函数声明 */
void app_msg_init(void);
bool app_msg_enqueue(nst_msg_queue_t *queue, uint8_t tp_value, const void *data, uint8_t len);
bool app_msg_dequeue(nst_msg_queue_t *queue, app_msg_t **msg);
bool app_msg_is_empty(nst_msg_queue_t *queue);
bool app_msg_is_full(nst_msg_queue_t *queue);
void app_msg_free(app_msg_t *msg); // 新增内存释放函数

#endif // APP_MSG_H
